package com.dycong.common.common;

import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;

/**
 * todo java.util.Random java.util.Random 从Java 1.0开始就存在了。它是一个线程安全类，理论上可以通过它同时在多个线程中获得互不相同的随机数。这样的线程安全是通过AtomicLong实现的。
 * Created by dycong on 2017/8/5.
 */
public class RandomTools {
    /*todo  1. 采用静态内部类方式构造 Random 单例(它是懒汉式的)，线程共享，竞争问题*/

    private static class SingletonHolder {
        private static final Random INSTANCE = new Random();

    }

    public static Random getInstance() {
        return SingletonHolder.INSTANCE;
    }

    /*todo 2. 多线程共享 Random 会因为竞争激烈，效率比较低，此时可以考虑引入 ThreadLocal 为每个线程拥有一个 Random*/

    private static final ThreadLocal<Random> threadLocal = new ThreadLocal<>();

    public static Random getThreadLocalRandom() {
        Random random = threadLocal.get();
        if (null == random) {
            random = new Random(System.nanoTime());
            threadLocal.set(random);
        }
        return random;
    }

/* todo 3. ThreadLocalRandom 的主要实现细节：这个新的API综合了其他两种方法的优点：单一实例/静态访问，就像Math.random()一样灵活。ThreadLocalRandom也比其他任何处理高并发的方法要更快。*/


    public static void main(String[] args) {
        System.out.println(System.currentTimeMillis());

        for (int i = 0; i < 100; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName() + ThreadLocalRandom.current()+"=="+ThreadLocalRandom.current().nextInt());
                }
            }).start();
        }
    }

}
